/**
 * 位置工具类
 * 用于处理地理位置相关的功能
 */

/**
 * 计算两个坐标点之间的距离（使用Haversine公式）
 * @param {number} lat1 第一个点的纬度
 * @param {number} lng1 第一个点的经度
 * @param {number} lat2 第二个点的纬度
 * @param {number} lng2 第二个点的经度
 * @returns {number} 距离（米）
 */
function calculateDistance(lat1, lng1, lat2, lng2) {
  const R = 6371000; // 地球半径（米）
  const dLat = (lat2 - lat1) * Math.PI / 180;
  const dLng = (lng2 - lng1) * Math.PI / 180;
  const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLng / 2) * Math.sin(dLng / 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  return R * c;
}

/**
 * 格式化距离显示
 * @param {number} distance 距离（米）
 * @returns {string} 格式化后的距离字符串
 */
function formatDistance(distance) {
  if (distance < 1000) {
    return Math.round(distance) + 'm';
  } else {
    return (distance / 1000).toFixed(1) + 'km';
  }
}

/**
 * 解析坐标字符串
 * @param {string} posStr 坐标字符串，格式如 "纬度,经度"
 * @returns {Object|null} 返回 {lat, lng} 或 null
 */
function parsePosition(posStr) {
  if (!posStr || typeof posStr !== 'string') {
    return null;
  }
  
  const parts = posStr.split(',');
  if (parts.length !== 2) {
    return null;
  }
  
  const lat = parseFloat(parts[0]);
  const lng = parseFloat(parts[1]);
  
  if (isNaN(lat) || isNaN(lng)) {
    return null;
  }
  
  return { lat, lng };
}

/**
 * 获取用户当前位置
 * @returns {Promise<Object>} 返回位置信息
 */
function getUserLocation() {
  return new Promise((resolve, reject) => {
    wx.getLocation({
      type: 'gcj02', // 使用国测局坐标系
      success: (res) => {
        resolve({
          latitude: res.latitude,
          longitude: res.longitude,
          success: true
        });
      },
      fail: (err) => {
        console.error('获取位置失败:', err);
        reject({
          success: false,
          error: err
        });
      }
    });
  });
}

/**
 * 为商家列表添加距离信息
 * @param {Array} bizList 商家列表
 * @param {Object} userLocation 用户位置 {latitude, longitude}
 * @returns {Array} 添加了距离信息的商家列表
 */
function addDistanceToBizList(bizList, userLocation) {
  if (!userLocation || !userLocation.latitude || !userLocation.longitude) {
    return bizList.map(biz => ({
      ...biz,
      distance: null,
      distanceText: '未知'
    }));
  }

  return bizList.map(biz => {
    const bizPos = parsePosition(biz.pos);
    let distance = null;
    let distanceText = '未知';

    if (bizPos) {
      distance = calculateDistance(
        userLocation.latitude,
        userLocation.longitude,
        bizPos.lat,
        bizPos.lng
      );
      distanceText = formatDistance(distance);
    }

    return {
      ...biz,
      distance,
      distanceText
    };
  });
}

/**
 * 按距离排序商家列表
 * @param {Array} bizList 商家列表（已包含distance字段）
 * @returns {Array} 按距离排序的商家列表
 */
function sortBizListByDistance(bizList) {
  return bizList.sort((a, b) => {
    // 如果距离未知，排在最后
    if (a.distance === null && b.distance === null) return 0;
    if (a.distance === null) return 1;
    if (b.distance === null) return -1;
    
    return a.distance - b.distance;
  });
}

module.exports = {
  calculateDistance,
  formatDistance,
  parsePosition,
  getUserLocation,
  addDistanceToBizList,
  sortBizListByDistance
}; 